SQlite源码分析

Mem3.c函数列表

Mem3.c中使用了21个函数,其函数名及功能列表如下。

编号 函数名 功能
1 memsys3UnlinkFromList(u32 i, u32 *pRoot) 将第i个项从双向链表中删除, 如果是第一个,则调整pRoot指针;同时调整 前一个的next指针,和后一个的prev指针。将卸下来的这一项的prev和next都设置为null。
2 memsys3Unlink(u32 i) 从双向循环链表中删除第i项。
3 memsys3LinkIntoList(u32 i, u32 *pRoot) 将 mem3.aPool[i] 插入到pRoot指向的链表的头部,更新pRoot指向新插入的这一项。
4 memsys3Link(u32 i) 将第i项插入链表中。
5 memsys3Enter(void) 获取STATIC_MEM mutex锁,保证数据库完整性。
6 memsys3Leave(void) 释放锁。
7 memsys3OutOfMemory(int nByte) 分配的内存不足时释放n字节空间。
8 void *memsys3Checkout(u32 i, u32 nBlock) 调整第i块的大小为nblock,为用户使用,返回该空间的地址。
9 void *memsys3FromMaster(u32 nBlock) 从iMaster开始的大chunk上切下nBlock的大小供用户使用,返回该空间的地址。
10 memsys3Merge(u32 *pRoot) 合并相邻chunk块到*pRoot指向的链表中,若块大于当前master,则将其替换。
11 void *memsys3MallocUnsafe(int nByte) 给用户分配n字节的空间,返回该空间的地址。
12 memsys3FreeUnsafe(void *pOld) 释放内存空间。
13 int memsys3Size(void *p) 以字节返回未分配内存大小(头8字节除外)。
14 int memsys3Roundup(int n) 聚集请求大小给下一个有效的内存分配大小。
15 void *memsys3Malloc(int nBytes) 申请分配n字节的内存空间。
16 void memsys3Free(void *pPrior) 释放*pPrior指向的内存空间。
17 void memsys3Realloc(void pPrior, int nBytes) 重新分配*pPrior指向的内存空间大小为n字节。
18 int memsys3Init(void *NotUsed) 初始化该内存分配器。
19 void memsys3Shutdown(void *NotUsed) 取消模块初始化设置。
20 void sqlite3Memsys3Dump(const char *zFilename) 将该内存分配器进行的操作写入日志文件。
21 const sqlite3_mem_methods *sqlite3MemGetMemsys3(void) 用于与外部链接。

Mem3.c就通过上面的结构体和函数来实现sqlite的内存分配,当然,实现内存的分配器不仅仅这一个,还有mem0.c\mem1.c\mem2.c\mem5.c,这些将在其他章节讲解。